// 文件名称: Group.java
// 创建日期: 2023-10-05
// 描述: 小组实体类，包含小组的各种属性及其对应的getter和setter方法，以及与数据库交互的方法。

package org.wisdom.studentchoose.db;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 小组实体类，包含小组的各种属性及其对应的getter和setter方法，以及与数据库交互的方法。
 */
public class Group {
    private final IntegerProperty id = new SimpleIntegerProperty();
    private final StringProperty name = new SimpleStringProperty();
    private static final StringProperty className = new SimpleStringProperty();

    /**
     * 构造函数，初始化小组对象。
     *
     * @param id 小组ID
     * @param name 小组名称
     * @param className 班级名称
     */
    public Group(int id, String name, String className) {
        this.id.set(id);
        this.name.set(name);
        this.className.set(className);
    }

    /**
     * 构造函数，初始化小组对象（ID为0表示自增）。
     *
     * @param name 小组名称
     * @param className 班级名称
     */
    public Group(String name, String className) {
        this(0, name, className); // 0 表示自增 ID
    }

    /**
     * 检查指定班级名称下的小组是否已存在。
     *
     * @param groupName 小组名称
     * @param className 班级名称
     * @return 如果存在返回true，否则返回false
     */
    public static boolean groupExists(String groupName, String className) {
        try (Connection connection = DatabaseConnection.getConnection()) {
            String checkGroupSql = "SELECT COUNT(*) FROM `groups` WHERE name = ? AND class_name = ?";
            try (PreparedStatement checkGroupStmt = connection.prepareStatement(checkGroupSql)) {
                checkGroupStmt.setString(1, groupName);
                checkGroupStmt.setString(2, className);
                try (ResultSet resultSet = checkGroupStmt.executeQuery()) {
                    if (resultSet.next()) {
                        return resultSet.getInt(1) > 0;
                    }
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 获取小组ID。
     *
     * @return 小组ID
     */
    public int getId() {
        return id.get();
    }

    /**
     * 获取小组ID的属性。
     *
     * @return 小组ID的属性
     */
    public IntegerProperty idProperty() {
        return id;
    }

    /**
     * 设置小组ID。
     *
     * @param id 小组ID
     */
    public void setId(int id) {
        this.id.set(id);
    }

    /**
     * 获取小组名称。
     *
     * @return 小组名称
     */
    public String getName() {
        return name.get();
    }

    /**
     * 获取小组名称的属性。
     *
     * @return 小组名称的属性
     */
    public StringProperty nameProperty() {
        return name;
    }

    /**
     * 设置小组名称。
     *
     * @param name 小组名称
     */
    public void setName(String name) {
        this.name.set(name);
    }

    /**
     * 获取班级名称。
     *
     * @return 班级名称
     */
    public String getClassName() {
        return className.get();
    }

    /**
     * 获取班级名称的属性。
     *
     * @return 班级名称的属性
     */
    public StringProperty classProperty() {
        return className;
    }

    /**
     * 设置班级名称。
     *
     * @param className 班级名称
     */
    public void setClassName(String className) {
        this.className.set(className);
    }

    /**
     * 从班级表中获取所有班级名称。
     *
     * @return 班级名称列表
     */
    public static List<String> getAllClassNamesFromClassesTable() {
        String sql = "SELECT name FROM `class`";
        List<String> classNames = new ArrayList<>();

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql);
             ResultSet rs = pstmt.executeQuery()) {
            while (rs.next()) {
                String className = rs.getString("name");
                classNames.add(className);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("查询班级列表失败：" + e.getMessage());
        }

        return classNames;
    }

    /**
     * 向数据库中插入新的小组。
     *
     * @param group 要插入的小组对象
     */
    public static void insertGroup(Group group) {
        try (Connection connection = DatabaseConnection.getConnection()) {
            String insertGroupSql = "INSERT INTO `groups` (name, class_name) VALUES (?, ?)";
            try (PreparedStatement insertGroupStmt = connection.prepareStatement(insertGroupSql)) {
                insertGroupStmt.setString(1, group.getName());
                insertGroupStmt.setString(2, group.getClassName());
                insertGroupStmt.executeUpdate();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 从数据库中删除指定ID的小组。
     *
     * @param id 要删除的小组ID
     */
    public static void deleteGroup(int id) {
        String sql = "DELETE FROM `groups` WHERE id = ?";

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setInt(1, id);
            pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("删除小组失败：" + e.getMessage());
        }
    }

    /**
     * 从数据库中获取所有小组。
     *
     * @return 小组列表
     */
    public static List<Group> getAllGroups() {
        String sql = "SELECT * FROM `groups`";
        List<Group> groups = new ArrayList<>();

        try (Connection conn = DatabaseConnection.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql);
             ResultSet rs = pstmt.executeQuery()) {
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String className = rs.getString("class_name");
                groups.add(new Group(id, name, className));
            }
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("查询小组失败：" + e.getMessage());
        }
        return groups;
    }
}
